Fehlerbehandlung

Das Hilfethema Testing und Debugging unterscheidet Syntaxfehler und logische Fehler. Beide Fehler können zur Entwicklungszeit (engl. at compile time) oder zur Laufzeit (engl. at run time) auftreten. Während praktisch alle Syntaxfehler von der Enwicklungsumgebung erkannt werden, liegt es am Entwickler, logische Fehler möglichst früh durch systematisches Testen und unter Nutzung des Debuggers zu entdecken. In der Regel ist es aber nicht möglich, alle Fehler vorausschauend zu vermeiden. Die meisten Programmiersprachen lassen deshalb Fehlerbehandlungscode zu, der die Auswirkungen später auftretender Fehler minimiert.

Je nach Entwicklungswerkzeug, kann die Fehlerbehandlung unterschiedlich sein. MS Access behandelt zum Beispiel Formular- und Berichtsfehler, VBA-Fehler im engeren Sinn und Fehler, die in DAO- und ADO-Objekten auftreten, verschieden. Dieses Hilfethema fasst die einfachste Form der Fehlerbehandlung in Formular- und Berichtsmodulen sowie in VBA-Prozeduren zusammen.

Formular- und Berichtsmodule

Der Fehlerbehandlungscode für ein Formular- oder Berichtsmodul fängt Fehler ab, die auftreten, wenn der Fokus auf dem Formular oder Bericht liegt. Der Entwickler kann aus der Eigenschaftenliste eines Formulars oder Berichts das Skelett der Reaktion auf das Ereignis 'Bei Fehler' generieren lassen. Diese Ereignisprozedur wird dann ausgeführt, wenn ein Laufzeitfehler vom Formular- oder Berichtsmodul entdeckt wird. Typische Laufzeitfehler in Formularen sind:

Meist ist es unmöglich, auf alle Fehler spezifisch - vor allem unter Berücksichtigung des Benutzers - zu reagieren. Am Ende des Fehlerbehandlungscode steht deshalb meist eine Catch All-Anweisung, die immer dann eine systemdefinierte Meldung anzeigt, wenn der Fehler nicht bereits abgefangen worden ist.

Der folgende Fehlerbehandlungscode reagiert auf zwei unzulässige Zeitbudget-Eingaben im Formular FrmEssay  und auf die übrigen Fehler mit einer Catch All-Anweisung:

Private Sub Form_Error(DataErr As Integer, Response As Integer)
  If DataErr = cNrDatentypUngültig Then
    MsgBox "Geben Sie eine Zahl ein.", vbOKOnly+vbExclamation, cHdDatentypUngültig
    Me.Undo
    Response = acDataErrContinue
  ElseIf DataErr = cNrGültigkeitsregelVerletzt Then
    'Formulareigenschaft 'Gültigkeitsmeldung' anzeigen und fehlerhafte Eingabe löschen
    Me.Undo
  Else
    MsgBox "'" & DataErr & "  " & Error(DataErr) & "' im Formular " & "ESSAYAUFGABE", vbOKOnly + vbExclamation, cHdDefault
    Response = acDataErrContinue
  End If
End Sub

Die Prozedur Form_Error importiert nach einem Laufzeitfehler den systemdefinierten Fehlercode DataErr. In Abhängigkeit von seinem Wert reagiert die Prozedur. cNrDatentypUngültig ist eine benutzerdefinierte benannte Konstante für die systemdefinierte Zahl 2113. Nach dem Auftreten des Fehlers 2113 macht Me.Undo die letzte Eingabe des Formulars rückgängig und fordert den Benutzer auf, eine Zahl statt einer alphabetischen Eingabe einzugeben. cHdDatentypUngültig = "Datentyp ungültig" ist der benutzerdefinierte Standardtitel der Meldung. Mit dem Ausgabeargument Response = acDataErrContinue informiert die Fehlerprozedur das Laufzeitsystem von MS Access, dass es den Code ohne Standard-Fehlermeldung fortsetzen soll.

Die Meldung auf den Fehler cNrGültigkeitsregelVerletzt ist leer, weil eine entsprechende Meldung bereits von den folgenden Eigenschaften des Textfelds TxfZeitbudget definiert wird:

Die Reaktion beschränkt sich deshalb darauf, die letzte Eingabe in das Textfeld rückgängig zu machen. Weil Response kein Wert zugewiesen wird, benutzt MS Access die im Eigenschaftenfenster definierte Gültigkeitsmeldung.

Wenn der Entwickler einen Fehlercode nicht spezifisch beantwortet, zeigt MS Access eine Standardfehlermeldung an. Diese kann die Entwicklerin durch eine eigene Catch All-Anweisung teilweise ersetzen. Die oben definierte Catch All-Meldung gibt einen Text des folgenden Formats aus: "'<Standardfehlertext>' im Formular ESSAYAUFGABE". Die Funktion Error(DataErr) ergibt den Standardfehlertext. cHdDefault verweist auf den Titel "Bitte notieren Sie die Fehlermeldung für Ihren PC-Koordinator.".

VBA-Prozeduren

Wenn die Entwicklerin keinen Fehlerbehandlungscode schreibt, führt jeder Laufzeitfehler zur Anzeige einer systemdefinierten Fehlermeldung und zum Programmende. Wenn die Entwicklerin hingegen eine On Error GoTo-Anweisung zu einer VBA-Prozedur hinzufügt, verzweigt Visual Basic beim Auftreten eines Laufzeitfehlers automatisch in eine Fehlerbehandlungsprozedur. 

Private Sub MCErgebnisskelette_Einfügen(lfTestschlüssel As Long)
  'Vereinbarungen
  '...
  On Error GoTo Fehlerbehandlung
  
  'Code, der Skelette für Mehrfachwahlergebnisse einfügt
  '...
  Exit Sub            'Fehlerbehandlung überspringen

Fehlerbehandlung:
  If Err.Number = cPrimärschlüsselDoppelt Then
    MsgBox "Skelett bereits vorhanden.", vbOKOnly+vbExclamation, cHdPrimärschlüsselDoppelt
  End If
End Sub

Fehlerbehandlung ist eine benutzerdefinierte Marke, worauf die Prozedur nach einem Laufzeitfehler springt. Number ist eine Eigenschaft des Fehlerobjekts Err. Ein Fehler füllt die Eigenschaften des Err-Objekts mit Information, welche den Fehler sowie die Informationen, die zur Verarbeitung des Fehlers verwendet werden können, identifizieren.

Laufzeitfehlerbehandlung